package com.cjl.jdk8;

import java.util.ArrayList;
import java.util.List;

public class HashMapTest {

//    这里所有的元素存放都需要获取一个索引位置，而如果元素的位置不够散列碰撞严重，那么就失去了散列表存放的意义，没有达到预期的性能。   扰动函数  高低16位，进行异或,散列更均匀
//    在获取索引ID的计算公式中，需要数组长度是2的倍数，那么怎么进行初始化这个数组大小。   2^n 最接近初始大小的
//    数组越小碰撞的越大，数组越大碰撞的越小，时间与空间如何取舍。                     loadFactor 0.75   越小，空间换时间
//    目前存放7个元素，已经有两个位置都存放了2个字符串，那么链表越来越长怎么优化。        8->红黑树
//    随着元素的不断添加，数组长度不足扩容时，怎么把原有的元素，拆分到新的位置上去。       1.7 1.8 扩容差异

    //O(1)
    public static void main(String[] args) {
        // 初始化一组字符串
        List<String> list = new ArrayList<>();
        list.add("jlkk");
        list.add("lopi");
        list.add("小傅哥");
        list.add("e4we");
        list.add("alpo");
        list.add("yhjk");
        list.add("plop");

        // 定义要存放的数组
        String[] tab = new String[8];
        for (String s : list) {
            int idx = s.hashCode() & (tab.length-1);
            System.out.println(String.format("key值=%s Idx=%d", s, idx));
            if (tab[idx] == null){
                tab[idx] = s;
                continue;
            }
            tab[idx]= tab[idx]+"->"+s;
        }

        System.out.println("HashMapTest.main "+tab);
    }

}
